/**
 * 
 */
package org.andy.dbmove.manager;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author yanwei
 * 
 */
public class CreateTable {
	private static InputStream is = null;

	/**
	 * 创建表脚本
	 * 
	 * create table aa( a int(11) );
	 * 
	 * @param lts
	 * @return
	 * @throws Exception
	 */
	public List<String> createTableScript(List<Table> lts) throws Exception {

		List<String> listStr = new ArrayList<String>();
		StringBuilder sb = null;
		for (Table t : lts) {
			String paramkey = "";
			sb = new StringBuilder("create table `" + t.getTableName())
					.append("` (");
			int i = 0;
			for (Columns c : t.getColumns()) {
				String type = null;
				if (i > 0)
					sb.append(",");
				sb.append(" `").append(c.getColName()).append("` ");
				// 字段名
				type = concatTypeAndLen(c.getColType().toLowerCase(),
						c.getLength());
				sb.append(type).append(" ")// 类型 大小
						.append(!c.isNullAble() ? " not null " : "")// 是否为空
						.append(c.isAuto() ? " AUTO_INCREMENT " : "");// 是否自动增加序列
				if (!c.isPrmkey()) {
					if (null != c.getDefaultValue()
							&& !"".equals(c.getDefaultValue())) {
						if (type.toLowerCase().trim().equals("datetime")
								|| type.toLowerCase().trim().equals("text")
								|| type.toLowerCase().trim().equals("longtext")) {
							sb.append("");
						} else {
							sb.append((null != c.getDefaultValue()) ? " DEFAULT "
									+ c.getDefaultValue().replace("(", "")
											.replace(")", "") + ""
									: "");// 是否有默认值
						}
					}
				}
				sb.append((null != c.getComment()) ? " COMMENT '"
						+ c.getComment() + "'" : "");// 注释
				if (c.isPrmkey()) {
					paramkey += ",`" + c.getColName() + "`";
				}
				i++;
			}
			if (!"".equals(paramkey))
				sb.append(", PRIMARY KEY (").append(paramkey.substring(1))
						.append(")");
			sb.append(") ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;");
			listStr.add(sb.toString());
		}
		return listStr;
	}

	/**
	 * 返回转换后的类型
	 * 
	 * @param type
	 * @return
	 */
	public String concatTypeAndLen(String type, int length) throws Exception {
		java.util.Properties prop = new java.util.Properties();

		is = this.getClass().getClassLoader()
				.getResourceAsStream("difference.properties");
		if (null == is)
			throw new Exception("没有读到difference.properties配置文件信息!");
		String sql = "";
		try {

			prop.load(is);
			String value = prop.getProperty(type);

			if (null != value) {
				String[] strs = value.split("~");
				sql = sql + strs[0];
				if (strs[1].indexOf("(") != -1) {
					sql += strs[1] + " ";
				} else if (strs[1].indexOf("[") != -1) {
					sql += "(" + length + ")";
				} else {
					sql += " ";
				}
			}
		} finally {
			if (null != is)
				try {
					is.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		}

		return sql;
	}

	private static boolean isBlank(String str) {
		return null == str || "".equals(str) ? false : true;
	}

	private static String digui(String s, BufferedReader stdin)
			throws IOException {
		String var = null;
		System.out.print(s);
		var = stdin.readLine();
		if (!isBlank(var)) {
			digui(s, stdin);
		} else {
			rvar = var;
		}
		return rvar;
	}

	static String rvar = null;

	public static void main(String[] args) {
		// 获取必要信息
		ConstVar cv = ConstVar.getInstance();
		BufferedReader stdin = new BufferedReader(new InputStreamReader(
				System.in));

		try {
			System.out
					.println("===============MS-SQL 数据库信息输入===============\n");
			digui("请输入MS-SQL 数据库名:", stdin);
			// System.out.print("请输入MS-SQL 数据库名:");
			// var = stdin.readLine();
			// if (isBlank(var)) {
			cv.setMsDbName(rvar);
			// }
			digui("请输入MS-SQL 数据库用户名:", stdin);
			// System.out.print("请输入MS-SQL 数据库用户名:");
			// var = stdin.readLine();
			// if (isBlank(var)) {
			cv.setMsName(rvar);
			// }
			digui("请输入MS-SQL 数据库用户密码:", stdin);
			// System.out.print("请输入MS-SQL 数据库用户密码:");
			// var = stdin.readLine();
			// if (isBlank(var)) {
			cv.setMsPwd(rvar);
			// }
			digui("请输入MS-SQL 数据库IP与端口[输入格式:192.168.0.1:1234]:", stdin);
			// System.out.print("请输入MS-SQL 数据库IP与端口[输入格式:192.168.0.1:1234]:");
			// var = stdin.readLine();
			// if (isBlank(var)) {
			cv.setMsUrl(rvar);
			// }
			System.out.println("===============MYSQL 数据库信息输入===============\n");
			digui("请输入MYSQL 数据库名:", stdin);
			// System.out.print("请输入MYSQL 数据库名:");
			// var = stdin.readLine();
			// if (isBlank(var)) {
			cv.setMyDbName(rvar);
			// }
			digui(rvar + "在MYSQL中是否已创建？[Y/N]:", stdin);
			if (rvar.trim().equals("Y"))
				cv.setCreateDb(true);
			else
				cv.setCreateDb(false);

			digui("请输入MYSQL 数据库用户名:", stdin);
			// System.out.print("请输入MYSQL 数据库用户名:");
			// var = stdin.readLine();
			// if (isBlank(var)) {
			cv.setMyName(rvar);
			// }
			digui("请输入MYSQL 数据库用户密码:", stdin);
			// System.out.print("请输入MYSQL 数据库用户密码:");
			// var = stdin.readLine();
			// if (isBlank(var)) {
			cv.setMyPwd(rvar);
			// }
			digui("请输入MYSQL 数据库IP与端口[输入格式:192.168.0.1:1234]:", stdin);
			// System.out.print("请输入MYSQL 数据库IP与端口[输入格式:192.168.0.1:1234]:");
			// var = stdin.readLine();
			// if (isBlank(var)) {
			cv.setMyUrl(rvar);
			// }
			System.out.println("设置导入数据提交数量(默认:10000):");
			String var = stdin.readLine();
			if(isBlank(var))
				cv.setComitNum(Integer.valueOf(var));
			
			else
				cv.setComitNum(10000);
		} catch (IOException e1) {
			System.out.println("读取输入数据出错！\n");
		}

		// ///
		List<Table> l = null;
		List<String> cl = null;
		try {
			l = new TableSplit().sqlServerTables();
		 cl = new CreateTable().createTableScript(l);
		} catch (Exception e) {
			e.printStackTrace();
		}
		Connection conn = null;
		java.sql.PreparedStatement prsmt = null;

		try {

			// String drop = "drop database if exists "+cv.getMyDbName();
			String cdb = "CREATE DATABASE  IF NOT EXISTS "
					+ ConstVar.getInstance().getMyDbName()
					+ " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
			// int idrop = conn.createStatement().executeUpdate(drop);
			// if(idrop>0)
			// 创建数据库
			if (!cv.isCreateDb()) {
				try {
					conn = MySQL.getMysqlConnByMsql();
					int i = conn.createStatement().executeUpdate(cdb);
					if (i > 0)
						System.out.println(cv.getMyDbName() + "已创建成功！！\n");
					else {
						System.out.println(cv.getMyDbName() + "已创建失败！！\n");
						return;
					}
				} finally {
					if (null != conn)
						conn.close();
				}
			}
			conn = MySQL.getMysqlConn();// 创建表连接
			for (String s : cl) {
				prsmt = conn.prepareStatement(s);
				prsmt.executeUpdate();
				// System.out.println("create table ===>>" + s);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {

			try {
				if (null != conn)
					conn.close();
				if (null != prsmt)
					prsmt.close();
				if (null != is)
					is.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		System.out.println("插入数据\n");

		SQL.batchInsert(l);

	}

}
